package com.smart.community.notification.service;

import com.smart.community.commons.base.IBaseService;
import com.smart.community.commons.result.PageResult;
import com.smart.community.commons.result.Result;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息通知Service接口
 * 提供站内消息、短信、推送、邮件等通知功能
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
public interface INotificationService extends IBaseService {

    // ======================== 站内消息管理 ========================
    
    /**
     * 发送站内消息
     * @param senderId 发送人ID
     * @param receiverId 接收人ID
     * @param title 消息标题
     * @param content 消息内容
     * @param messageType 消息类型：1-系统通知，2-用户消息，3-公告消息，4-活动通知
     * @return 发送结果
     */
    Result<String> sendMessage(Long senderId, Long receiverId, String title, String content, Integer messageType);
    
    /**
     * 批量发送站内消息
     * @param senderId 发送人ID
     * @param receiverIds 接收人ID列表
     * @param title 消息标题
     * @param content 消息内容
     * @param messageType 消息类型
     * @return 发送结果
     */
    Result<List<String>> batchSendMessage(Long senderId, List<Long> receiverIds, String title, String content, Integer messageType);
    
    /**
     * 获取用户消息列表
     * @param userId 用户ID
     * @param messageType 消息类型（可选）
     * @param readStatus 阅读状态（可选）
     * @param current 当前页
     * @param size 每页大小
     * @return 消息列表
     */
    Result<PageResult<MessageVO>> getUserMessages(Long userId, Integer messageType, Integer readStatus, Integer current, Integer size);
    
    /**
     * 获取消息详情
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 消息详情
     */
    Result<MessageVO> getMessageDetail(String messageId, Long userId);
    
    /**
     * 标记消息为已读
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 操作结果
     */
    Result<Void> markAsRead(String messageId, Long userId);
    
    /**
     * 删除消息
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 操作结果
     */
    Result<Void> deleteMessage(String messageId, Long userId);
    
    /**
     * 获取未读消息数量
     * @param userId 用户ID
     * @return 未读数量
     */
    Result<Long> getUnreadCount(Long userId);

    // ======================== 短信服务 ========================
    
    /**
     * 发送验证码短信
     * @param phoneNumber 手机号码
     * @param templateCode 模板编码
     * @param templateParams 模板参数
     * @param expireTime 过期时间
     * @return 发送结果
     */
    Result<String> sendVerificationSms(String phoneNumber, String templateCode, String templateParams, LocalDateTime expireTime);
    
    /**
     * 发送通知短信
     * @param phoneNumber 手机号码
     * @param templateCode 模板编码
     * @param templateParams 模板参数
     * @return 发送结果
     */
    Result<String> sendNotificationSms(String phoneNumber, String templateCode, String templateParams);
    
    /**
     * 批量发送短信
     * @param phoneNumbers 手机号码列表
     * @param templateCode 模板编码
     * @param templateParams 模板参数
     * @return 发送结果
     */
    Result<List<String>> batchSendSms(List<String> phoneNumbers, String templateCode, String templateParams);
    
    /**
     * 获取短信发送记录
     * @param phoneNumber 手机号码（可选）
     * @param smsType 短信类型（可选）
     * @param sendStatus 发送状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param current 当前页
     * @param size 每页大小
     * @return 短信记录
     */
    Result<PageResult<SmsRecordVO>> getSmsRecords(String phoneNumber, Integer smsType, Integer sendStatus, LocalDateTime startTime, LocalDateTime endTime, Integer current, Integer size);
    
    /**
     * 查询短信发送状态
     * @param smsId 短信ID
     * @return 发送状态
     */
    Result<SmsStatusVO> getSmsStatus(String smsId);

    // ======================== 推送通知 ========================
    
    /**
     * 发送App推送通知
     * @param userId 用户ID
     * @param platform 平台：1-iOS，2-Android，3-Web
     * @param title 推送标题
     * @param content 推送内容
     * @param payload 推送载荷(JSON)
     * @return 发送结果
     */
    Result<String> sendPushNotification(Long userId, Integer platform, String title, String content, String payload);
    
    /**
     * 批量发送推送通知
     * @param userIds 用户ID列表
     * @param platform 平台（可选）
     * @param title 推送标题
     * @param content 推送内容
     * @param pushType 推送类型：1-系统通知，2-业务通知，3-活动推广
     * @return 发送结果
     */
    Result<List<String>> batchSendPushNotification(List<Long> userIds, Integer platform, String title, String content, Integer pushType);
    
    /**
     * 获取推送记录
     * @param userId 用户ID
     * @param platform 平台（可选）
     * @param pushType 推送类型（可选）
     * @param sendStatus 发送状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param current 当前页
     * @param size 每页大小
     * @return 推送记录
     */
    Result<PageResult<PushRecordVO>> getPushRecords(Long userId, Integer platform, Integer pushType, Integer sendStatus, LocalDateTime startTime, LocalDateTime endTime, Integer current, Integer size);
    
    /**
     * 查询推送状态
     * @param pushId 推送ID
     * @return 推送状态
     */
    Result<PushStatusVO> getPushStatus(String pushId);

    // ======================== 邮件服务 ========================
    
    /**
     * 发送邮件
     * @param senderEmail 发送邮箱
     * @param receiverEmail 接收邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param contentType 内容类型：1-纯文本，2-HTML
     * @return 发送结果
     */
    Result<String> sendEmail(String senderEmail, String receiverEmail, String subject, String content, Integer contentType);
    
    /**
     * 发送模板邮件
     * @param senderEmail 发送邮箱（可选）
     * @param receiverEmail 接收邮箱
     * @param ccEmails 抄送邮箱列表
     * @param bccEmails 密送邮箱列表
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param contentType 内容类型
     * @param attachments 附件列表
     * @param userId 关联用户ID
     * @return 发送结果
     */
    Result<String> sendTemplateEmail(String senderEmail, String receiverEmail, List<String> ccEmails, List<String> bccEmails, String subject, String content, Integer contentType, List<String> attachments, Long userId);
    
    /**
     * 批量发送邮件
     * @param receiverEmails 接收邮箱列表
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param businessType 业务类型
     * @param businessId 业务ID
     * @param attachmentUrl 附件URL
     * @return 发送结果
     */
    Result<List<String>> batchSendEmail(List<String> receiverEmails, String subject, String content, String businessType, Long businessId, String attachmentUrl);
    
    /**
     * 获取邮件发送记录
     * @param senderEmail 发送邮箱（可选）
     * @param receiverEmail 接收邮箱（可选）
     * @param sendStatus 发送状态（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param current 当前页
     * @param size 每页大小
     * @return 邮件记录
     */
    Result<PageResult<EmailRecordVO>> getEmailRecords(String senderEmail, String receiverEmail, Integer sendStatus, LocalDateTime startTime, LocalDateTime endTime, Integer current, Integer size);
    
    /**
     * 查询邮件发送状态
     * @param emailId 邮件ID
     * @return 发送状态
     */
    Result<EmailStatusVO> getEmailStatus(String emailId);

    // ======================== 统计分析 ========================
    
    /**
     * 获取消息统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param userId 用户ID（可选）
     * @return 统计信息
     */
    Result<MessageStatisticsVO> getMessageStatistics(LocalDateTime startTime, LocalDateTime endTime, Long userId);
    
    /**
     * 获取短信统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param smsType 短信类型（可选）
     * @return 统计信息
     */
    Result<SmsStatisticsVO> getSmsStatistics(LocalDateTime startTime, LocalDateTime endTime, Integer smsType);
    
    /**
     * 获取推送统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pushType 推送类型（可选）
     * @return 统计信息
     */
    Result<PushStatisticsVO> getPushStatistics(LocalDateTime startTime, LocalDateTime endTime, Integer pushType);
    
    /**
     * 获取邮件统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    Result<EmailStatisticsVO> getEmailStatistics(LocalDateTime startTime, LocalDateTime endTime);

    // ======================== 内部类定义 ========================
    
    /**
     * 消息VO
     */
    class MessageVO {
        private String messageId;
        private Long senderId;
        private String senderName;
        private Long receiverId;
        private String receiverName;
        private String title;
        private String content;
        private Integer messageType;
        private Integer readStatus;
        private LocalDateTime sendTime;
        private LocalDateTime readTime;
        private LocalDateTime expireTime;
        private String relatedType;
        private Long relatedId;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 消息统计VO
     */
    class MessageStatisticsVO {
        private Long totalCount;
        private Long unreadCount;
        private Long readCount;
        private Long systemNotifyCount;
        private Long userMessageCount;
        private Long announceCount;
        private Long activityNotifyCount;
        private Long verificationCount;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 短信记录VO
     */
    class SmsRecordVO {
        private String smsId;
        private String phoneNumber;
        private String templateCode;
        private String templateParams;
        private Integer smsType;
        private Integer sendStatus;
        private String provider;
        private String failReason;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private Long userId;
        private String businessType;
        private Long businessId;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 短信状态VO
     */
    class SmsStatusVO {
        private String smsId;
        private Integer sendStatus;
        private String statusDescription;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private String failReason;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 短信统计VO
     */
    class SmsStatisticsVO {
        private Long totalCount;
        private Long successCount;
        private Long failCount;
        private Long pendingCount;
        private Long verificationCount;
        private Long notificationCount;
        private Long marketingCount;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 推送记录VO
     */
    class PushRecordVO {
        private String pushId;
        private Long userId;
        private String deviceToken;
        private Integer platform;
        private String title;
        private String content;
        private String payload;
        private Integer pushType;
        private Integer priority;
        private Integer sendStatus;
        private Integer clickStatus;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private LocalDateTime clickTime;
        private LocalDateTime expireTime;
        private String failReason;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 推送状态VO
     */
    class PushStatusVO {
        private String pushId;
        private Integer sendStatus;
        private Integer clickStatus;
        private String statusDescription;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private LocalDateTime clickTime;
        private String failReason;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 推送统计VO
     */
    class PushStatisticsVO {
        private Long totalCount;
        private Long successCount;
        private Long failCount;
        private Long pendingCount;
        private Long clickCount;
        private Long iosCount;
        private Long androidCount;
        private Long webCount;
        private Long systemNotifyCount;
        private Long businessNotifyCount;
        private Long marketingCount;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 邮件记录VO
     */
    class EmailRecordVO {
        private String emailId;
        private String senderEmail;
        private String senderName;
        private String receiverEmail;
        private String receiverName;
        private String subject;
        private String content;
        private Integer contentType;
        private Integer sendStatus;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private String failReason;
        private Long userId;
        private String businessType;
        private Long businessId;
        private String attachmentUrl;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 邮件状态VO
     */
    class EmailStatusVO {
        private String emailId;
        private Integer sendStatus;
        private String statusDescription;
        private LocalDateTime sendTime;
        private LocalDateTime receiveTime;
        private String failReason;
        
        // 构造器和getter/setter方法省略
    }
    
    /**
     * 邮件统计VO
     */
    class EmailStatisticsVO {
        private Long totalCount;
        private Long successCount;
        private Long failCount;
        private Long pendingCount;
        private Long systemNotifyCount;
        private Long businessNotifyCount;
        private Long marketingCount;
        
        // 构造器和getter/setter方法省略
    }
}
